home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / icon / packages.lha / packages / atari / ats.arc / TESTS.ARC / COLLATE.ICN < prev    next >
Text File  |  1990-03-28  |  2KB  |  61 lines

  1. procedure main()
  2.    s1 := collate(&cset,&cset)
  3.    s2 := collate(reverse(&cset),reverse(&cset))
  4.    write(image(decollate(s1,0)))
  5.    write(image(decollate(s1,1)))
  6.    write(image(decollate(s2,1)))
  7.    write(image(decollate(s2,0)))
  8. end
  9.  
  10. procedure collate(s1,s2)
  11.   local length, ltemp, rtemp, t
  12.   static llabels, rlabels, clabels, blabels, half
  13.   initial {
  14.     llabels := "abxy"
  15.     rlabels := "cduv"
  16.     blabels := llabels || rlabels
  17.     clabels := "acbdxuyv"
  18.     half := 4
  19.     ltemp := left(&cset,*&cset/2)
  20.     rtemp := right(&cset,*&cset/2)
  21.     clabels := collate(ltemp,rtemp)
  22.     llabels := ltemp
  23.     rlabels := rtemp
  24.     blabels := string(&cset)
  25.     half := *llabels
  26.     }
  27.    if *s1 > *s2 then {
  28.       t := s1[*s2+1:0]
  29.       s1 := s1[1:*s2+1]
  30.       }
  31.    else if *s2 > *s1 then {
  32.       t := s2[*s1+1:0]
  33.       s2 := s2[1:*s1+1]
  34.       }
  35.    else t := ""
  36.   length := *s1
  37.   if length <= half then
  38.     return map(left(clabels,2*length),left(llabels,length) ||
  39.       left(rlabels,length),s1 || s2) || t
  40.   else
  41.     return map(clabels,blabels,left(s1,half) || left(s2,half)) ||
  42.       collate(right(s1,length-half),right(s2,length-half)) || t
  43. end
  44.  
  45. procedure decollate(s,n)
  46.    static dsize, image, object
  47.    local ssize
  48.    initial {
  49.       image := collate(&cset[2:0],repl(&cset[1],*&cset-1))
  50.       object := string(&cset)
  51.       dsize := *image
  52.       }
  53.    n %:= 2
  54.    ssize := *s
  55.    if ssize + n <= dsize then
  56.       return map(object[1+:(ssize+n)/2],image[(n+1)+:ssize],s)
  57.    else
  58.       return map(object[1+:(dsize-2)/2],image[(n+1)+:dsize-2],
  59.          s[1+:(dsize-2)]) || decollate(s[dsize-1:0],n)
  60. end
  61.